<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const arr = [
            { 'id': '29', 'pid': '', 'name': '总裁办' },
            { 'id': '2c', 'pid': '', 'name': '财务部' },
            { 'id': '2d', 'pid': '2c', 'name': '财务核算部' },
            { 'id': '2f', 'pid': '2c', 'name': '薪资管理部' },
            { 'id': 'd2', 'pid': '', 'name': '技术部' },
            { 'id': 'd3', 'pid': 'd2', 'name': 'Java研发部' }
        ]
        function listTree(list) {
            // 1. 定义两个中间变量
            const treeList = []// 最终要产出的树状数据的数组
            const map = {}
            // 2. 建立一个映射关系，并给每个元素补充children属性.
            // 映射关系: 目的是让我们能通过id快速找到对应的元素
            // 补充children：让后边的计算更方便
            list.forEach(item => {
                if (!item.children) {
                    item.children = []
                }
                map[item.id] = item
            })
            // 3. 循环处理每个元素
            list.forEach(item => {
                // 对于每一个元素来说，先找它的上级
                //    如果能找到，说明它有上级，则要把它添加到上级的children中去
                //    如果找不到，说明它没有上级，直接添加到 treeList
                const parent = map[item.pid]
                // 如果存在则表示item不是最顶层的数据
                if (parent) {
                    parent.children.push(item)
                } else {
                    // 如果不存在 则是顶层数据
                    treeList.push(item)
                }
            })
            // 返回出去
            return treeList
        }
        console.log(listTree(arr));
    </script>
</body>

</html>